/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.smscserver.message;
import java.io.InputStream;
import javax.sql.DataSource;
import org.apache.commons.lang.StringUtils;
import org.apache.smscserver.SmscServerConfigurationException;
import org.apache.smscserver.message.impl.DBMessageManager;
import org.apache.smscserver.smsclet.MessageManager;
import org.apache.smscserver.util.IoUtils;
import org.h2.jdbcx.JdbcDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Factory for database based <code>MessageManager</code>.
*
* @author hceylan
*/
public class DBMessageManagerFactory implements MessageManagerFactory {
private static final Logger LOG = LoggerFactory.getLogger(DBMessageManagerFactory.class);
private DataSource datasource;
private String embeddedProfile;
private String sqlCreateTable;
private String sqlInsertMessage;
private String sqlSelectLatestReplacableMessage;
private String sqlSelectMessage;
private String sqlSelectUserMessage;
private String sqlUpdateMessage;
private String url;
public DBMessageManagerFactory() {
super();
}
public DBMessageManagerFactory(String embeddedProfile, String url) {
super();
this.embeddedProfile = embeddedProfile;
this.url = url;
}
private void check(Object field, boolean required, String errorMessage) {
if (field == null) {
if (required) {
// FIXME: Hasan for now
throw new SmscServerConfigurationException("Required " + errorMessage);
} else {
DBMessageManagerFactory.LOG.warn("Optional parameter {}", errorMessage);
}
}
}
private void configureEmbeddedMode() {
if (this.datasource == null) {
if (StringUtils.isEmpty(this.url)) {
throw new SmscServerConfigurationException(
"When using embedded mode and no datasource provided, URL paramater is required!");
}
JdbcDataSource ds = new JdbcDataSource();
ds.setURL(this.url);
ds.setUser("sa");
ds.setPassword("");
this.datasource = ds;
}
if (this.sqlCreateTable == null) {
this.sqlCreateTable = this.getProfileSQL("createtable");
}
if (this.sqlInsertMessage == null) {
this.sqlInsertMessage = this.getProfileSQL("insert");
}
if (this.sqlUpdateMessage == null) {
this.sqlUpdateMessage = this.getProfileSQL("update");
}
if (this.sqlSelectMessage == null) {
this.sqlSelectMessage = this.getProfileSQL("select");
}
if (this.sqlSelectUserMessage == null) {
this.sqlSelectUserMessage = this.getProfileSQL("select-user");
}
if (this.sqlSelectLatestReplacableMessage == null) {
this.sqlSelectLatestReplacableMessage = this.getProfileSQL("selectlatestreplacable");
}
}
/**
* {@inheritDoc}
*
*/
public MessageManager createMessageManager() {
if (this.embeddedProfile != null) {
DBMessageManagerFactory.LOG.info("Using embedded profile {}", this.embeddedProfile);
this.configureEmbeddedMode();
}
return this.createMessageManagerImpl();
}
private MessageManager createMessageManagerImpl() {
this.check(this.datasource, true, "datasource not provided");
this.check(this.sqlCreateTable, false,
"create table exist SQL statement not provided. Table should be manually created if doesn't exist");
this.check(this.sqlInsertMessage, true, "insert message SQL statement not provided");
this.check(this.sqlSelectMessage, true, "select message SQL statement not provided");
this.check(this.sqlUpdateMessage, true, " update message SQL statement not provided");
return new DBMessageManager(this.datasource, this.sqlCreateTable, this.sqlInsertMessage, this.sqlSelectMessage,
this.sqlSelectUserMessage, this.sqlUpdateMessage, this.sqlSelectLatestReplacableMessage);
}
private String getProfileSQL(String qualifier) {
try {
String sqlFile = "/org/apache/smscserver/config/db/messages-" + qualifier + "-" + this.embeddedProfile
+ ".sql";
DBMessageManagerFactory.LOG.debug("SQL File to read: {}", sqlFile);
InputStream is = this.getClass().getResourceAsStream(sqlFile);
return IoUtils.readFully(is);
} catch (Exception e) {
throw new SmscServerConfigurationException("Error reading SQL resource", e);
}
}
/**
* @param datasource
* the datasource to set
*/
public void setDataSource(DataSource datasource) {
this.datasource = datasource;
}
/**
* @param embeddedProfile
* the embeddedProfile to set
*/
public void setEmbeddedProfile(String embeddedProfile) {
this.embeddedProfile = embeddedProfile;
}
/**
* @param sqlCreateTable
* the sqlCreateTable to set
*/
public void setSqlCreateTable(String sqlCreateTable) {
this.sqlCreateTable = sqlCreateTable;
}
/**
* @param sqlInsertMessage
* the sqlInsertMessage to set
*/
public void setSqlInsertMessage(String sqlInsertMessage) {
this.sqlInsertMessage = sqlInsertMessage;
}
/**
* @param sqlSelectLatestReplacableMessage
* the sqlSelectLatestReplacableMessage to set
*/
public void setSqlSelectLatestReplacableMessage(String sqlSelectLatestReplacableMessage) {
this.sqlSelectLatestReplacableMessage = sqlSelectLatestReplacableMessage;
}
/**
* @param sqlSelectMessage
* the sqlSelectMessage to set
*/
public void setSqlSelectMessage(String sqlSelectMessage) {
this.sqlSelectMessage = sqlSelectMessage;
}
/**
* @param sqlSelectUserMessage
* the sqlSelectUserMessage to set
*/
public void setSqlSelectUserMessage(String sqlSelectUserMessage) {
this.sqlSelectUserMessage = sqlSelectUserMessage;
}
/**
* @param sqlUpdateMessage
* the sqlUpdateMessage to set
*/
public void setSqlUpdateMessage(String sqlUpdateMessage) {
this.sqlUpdateMessage = sqlUpdateMessage;
}
/**
* @param url
* the url to set
*/
public void setURL(String url) {
this.url = url;
}
}